分享主軸
是一套簡易加解密的機制,替代了 ASP.NET 1.x 到 4.x 中的 元素
加密和解密:使用對稱加密技術(如AES-256-CBC),確保只有授權的應用程序能夠讀取和寫入
密鑰管理:自動處理密鑰的生成、存儲和輪換,開發者無需手動管理密鑰
防篡改:確保數據在傳輸過程中未被修改,
隔離:即使在同一主機上運行多個應用程序,數據保護系統也能確保這些應用程序之間的數據隔離
簡單易用
提供了易於使用的API,開發者可以快速上手,無需深入了解底層的加密算法和密鑰管理
自動密鑰管理
系統自動處理密鑰的生成、存儲和輪換,減少了開發者的負擔。密鑰會定期更新(默認每90天)
隔離
使用用途字符串(purpose strings)來隔離不同用途的資料保護操作,確保不同用途的資料不會互相干擾
官方文件有說到 :
The data protection APIs aren't primarily intended for indefinite persistence of confidential payloads. Other technologies, such as Windows CNG DPAPI and Azure Rights Management are more suited to the scenario of indefinite storage. They have correspondingly strong key management capabilities. That said, the ASP.NET Core data protection APIs can be used for long-term protection of confidential data.
對於長期保存機密資料的方式有更好的技術,如 Windows CNG DPAPI 或是 Azure Rights Management,但是如果要使用也是可以的
只是這套機制對於在資料長期存取情境下以及密鑰這塊,就需要特別討論如何管理配置
Program.cs 註冊
builder.Services.AddDataProtection();
使用到的地方
public class HomeController : Controller
{
private readonly ILogger<HomeController> _logger;
private readonly IDataProtector _protector;
public HomeController(ILogger<HomeController> logger, IDataProtectionProvider protector)
{
_logger = logger;
// 指定一個用途字符串(purpose string)來隔離不同用途的資料保護 (如上說到的,隔離功能)
_protector = protector.CreateProtector("demov1.0");
}
public IActionResult Index()
{
// 加密
string originalData = "Sensitive data";
string protectedData = _protector.Protect(originalData);
// 解密
string unprotectedData = _protector.Unprotect(protectedData);
ViewData["EncryptEext"] = protectedData;
ViewData["DecryptEext"] = unprotectedData;
return View();
}
結果
將金鑰指定到特定位置
多個應用程式之間共用機器金鑰
builder.Services.AddDataProtection()
.PersistKeysToFileSystem(new DirectoryInfo(@"C:\keys")) // 設定密鑰存儲位置
.SetApplicationName("MyApp"); // 設定應用程序名稱以隔離密鑰
如上詳細設定請見文章
今日結語
之前專案上聽同事討論了這個有趣的東西,剛好前陣子也有使用到,雖然都是初步的,多認識一種機制,而且使用起來也很方便快速,真的很棒呢!
只是有些注意地方,還得深入研究才會更加了解!
今日就分享到這,明天繼續囉,加油 ~~
參考文章
https://andrewlock.net/an-introduction-to-the-data-protection-system-in-asp-net-core/